// 权限拦截 导航守卫 路由守卫  router
import { getToken } from './utils/auth'
import router from '@/router' // 引入路由实例
import store from '@/store' // 引入vuex store实例
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式

const whiteList = ['/login', '/404'] // 定义白名单  所有不受权限控制的页面
// 路由的前置守卫
router.beforeEach(async (to,from,next)=>{
    NProgress.start();
    // 进度条开始
    const token = getToken();
    if(store.getters.token){
        // 如果有token，且去的地方为登录页，直接跳转到主页。
       if(to.path=="/login"){
        next("/");
        NProgress.done();
       }else{
        // 跳转其他页面有token时，获取用户资料。
        if(!store.getters.userId){
            const {roles} = await  store.dispatch('user/getUserInfo');
            
            // console.log("权限",roles.menus);
            const routes = await store.dispatch("permission/filterRoutes",roles.menus);
            
            // 动态添加路由,把404添加到动态路由的后面。因为在刷新前，还没获取到新的动态路由，找不到会报404错误。
            await store.commit("permission/setPoint",roles.points);

            router.addRoutes([...routes,{ path: '*', redirect: '/404', hidden: true }]);
            // 这里有个非常容易出问题的位置，当我们判断用户是否已经添加路由的前后，不能都是用next()，
// 在添加路由之后应该使用 next(to.path)， 否则会使刷新页面之后 权限消失，这属于一个vue-router的已知缺陷
            next(to.path);
        }
        next();
        NProgress.done();
       }
    }else{
        if(whiteList.indexOf(to.path)!=-1){
            next();
            NProgress.done();
        }else{
            next("/login");
            NProgress.done();
        }
    }
})

  
router.afterEach((to,from)=>{
    NProgress.done();
})















